package com.changanw.tonumplus;

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        //定义一个新联表伪指针，用来指向头指针，返回结果
        ListNode pre = new ListNode(0);
        //定义一个可移动的指针，用来指向存储两个数之和的位置
        ListNode cur = pre;
        //定义一个进位数的指针，用来存储当两数之和大于10的时候，
        int carry = 0;
        while(l1 != null || l2 != null) {
            //如果l1 不等于null时，就取他的值，等于null时，就赋值0，保持两个链表具有相同的位数
            int x = l1 == null ? 0 : l1.val;
            //如果l2 不等于null时，就取他的值，等于null时，就赋值0，保持两个链表具有相同的位数
            int y = l2 == null ? 0 : l2.val;
            //当前值进行算术相加，并且加上进位值
            int sum = x + y + carry;

            //对值取商
            carry = sum / 10;
            //对10取余，创建新的节点
            // 计算两个数的和，此时排除超过10的请况（大于10，取余数）
            sum = sum % 10;
            //将求和数赋值给新链表的节点，
            //注意这个时候不能直接将sum赋值给cur.next = sum。这时候会报，类型不匹配。
            //所以这个时候要创一个新的节点，将值赋予节点
            cur.next = new ListNode(sum);

            //将新链表的节点后移
            cur = cur.next;
            //当链表l1不等于null的时候，将l1 的节点后移
            if(l1 != null)
                l1 = l1.next;
            //当链表l2 不等于null的时候，将l2的节点后移
            if(l2 != null)
                l2 = l2.next;
        }
        //如果最后两个数，相加的时候有进位数的时候，就将进位数，赋予链表的新节点。
        //两数相加最多小于20，所以的的值最大只能时1
        if(carry == 1) {
            //最后还需要进位的话 ，在创建一个节点
            cur.next = new ListNode(carry);
        }
        return pre.next;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        ListNode l1 = new ListNode(9,new ListNode(9));
        ListNode l2 = new ListNode(1);
        final ListNode listNode = s.addTwoNumbers(l1, l2);
        System.out.println(listNode.listToString(listNode));

    }
    public static void aaa(String[] args) {
        ListNode a = new ListNode(8);
        ListNode b = new ListNode(9);
        //ListNode c = new ListNode(3);
        a.next = b;
        //b.next = c;
        String abc = a.listToString(a);

        ListNode d = new ListNode(2);
        /*ListNode e = new ListNode(6);
        ListNode f = new ListNode(4);
        d.next = e;
        e.next = f;*/

        String def = d.listToString(d);

        int af = Integer.valueOf(abc) + Integer.valueOf(def);

        final char[] chars = String.valueOf(af).toCharArray();
        SingleLinked end = new SingleLinked();
        for (int length = chars.length-1; length >= 0; length--) {
           end.add(new ListNode(Integer.valueOf(String.valueOf(chars[length]))));
        }
        end.show();

    }
}
